import { defineConfig } from 'vite';
import { fileURLToPath, URL } from 'url';
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';
import vitePluginEslint from 'vite-plugin-eslint';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import { viteMockServe } from 'vite-plugin-mock';

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  return {
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
      },
    },
    base: '/cn-knowledge/notebook/',
    optimizeDeps: {
      include: ['@ant-design/icons-vue', 'ant-design-vue'],
    },
    plugins: [
      (mode === 'development' || mode === 'mock') &&
        vitePluginEslint({
          lintOnStart: false, // 启动时候是否就执行eslint校验，如果开启的话有eslint的报错则服务是会启动失败
        }),
      mode === 'mock' &&
        viteMockServe({
          mockPath: './src/mock', // 设置模拟 .ts 文件的存储文件夹
          supportTs: true, // 打开后，可以读取 ts ⽂件模块，请注意，打开后将⽆法监视 .js ⽂件。
          watchFiles: true, // 监视⽂件更改，并重新加载 mock 数据
          /* 
          如果生产环境开启了 mock 功能,即 prodEnabled=true. 则该代码会被注入到 injectFile 对应的文件的底部。默认为main.{ts,js}
          这样做的好处是,可以动态控制生产环境是否开启 mock 且在没有开启的时候 mock.js 不会被打包。
          如果代码直接写在 main.ts 内，则不管有没有开启,最终的打包都会包含mock.js
          */
          injectCode: `
            import { setupProdMockServer } from './mockProdServer';
            setupProdMockServer();
          `,
        }),
      AutoImport({
        dts: 'src/types/auto-imports.d.ts',
        imports: ['vue', 'vue-router'],
        eslintrc: {
          enabled: true,
          filepath: './.eslintrc-auto-import.json',
          globalsPropValue: true,
        },
      }),
      Components({
        dts: 'src/types/components.d.ts',
        deep: true,
        dirs: ['src/components'],
        extensions: ['vue', 'tsx'],
        resolvers: [
          AntDesignVueResolver({
            importStyle: false,
          }),
        ],
      }),
      vue(),
      vueJsx(),
    ],
    server: {
      proxy: {
        '/api/cn-knowledge/notebook': {
          // target: 'http://127.0.0.1:9001',
          target: 'https://www.mcainiaom.top/cainiao/api/cn-knowledge/notebook',
          changeOrigin: true,
          rewrite: (path: string) => path.replace(/^\/api\/cn-knowledge\/notebook/, ''),
        },
      },
    },
    build: {
      chunkSizeWarningLimit: 2000,
      rollupOptions: {
        output: {
          manualChunks: {
            antd: ['@ant-design/icons-vue', 'ant-design-vue'],
          },
        },
      },
    },
  };
});
